--包管理 luac .\19.包管理.lua

require("helper")

print(helper.getIp())

local helper = require("helper")

print(helper.getIp())

--local value = redis.call('get', KEYS[1]);
--if (value == false) then
--    redis.call('set', KEYS[1], ARGV[1]);
--    redis.call('publish', KEYS[2], ARGV[1])
--    return 1;
--end ;
--return 0;

--local value = redis.call('get', KEYS[1]);
--assert(value ~= false, 'Capacity of queue ' .. KEYS[1] .. ' has not been set');
--if (tonumber(value) >= tonumber(ARGV[1])) then
--    redis.call('decrby', KEYS[1], ARGV[1]);
--    redis.call('rpush', KEYS[2], unpack(ARGV, 2, #ARGV));
--    return 1;
--end ;
--return 0;
--
----打包成二进制数据
--local value = struct.pack('dLc0', tonumber(ARGV[2]), string.len(ARGV[3]), ARGV[3]);
----调用zadd将数据加入到sorted set
--redis.call('zadd', KEYS[2], ARGV[1], value);
----将打包的数据value右侧推入到list（普通list）
--redis.call('rpush', KEYS[3], value);
----通过sorted set 从小到大进行排序 拿到第0个到第0个数据 也就是第一个数据 即最快到期的数据
--local v = redis.call('zrange', KEYS[2], 0, 0);
----最快到期的数据是否跟本次添加的数据一样 如果一样，就发布
--if v[1] == value then
--    redis.call('publish', KEYS[4], ARGV[1]);
--end ;
--

--1 延迟时间是10秒  2 延迟时间是5秒

--获取延迟队列数据
--local v = redis.call('lpop', KEYS[1]);
--if v ~= false then
--    redis.call('zrem', KEYS[2], v);
--    local randomId, value = struct.unpack('dLc0', v);
--    return value;
--end
--return nil;

--监听的时候调用
local expiredValues = redis.call('zrangebyscore', KEYS[2], 0, ARGV[1], 'limit', 0, ARGV[2]);
if #expiredValues > 0 then
    for i, v in ipairs(expiredValues) do
        local randomId, value = struct.unpack('dLc0', v);
        redis.call('rpush', KEYS[1], value);
        redis.call('lrem', KEYS[3], 1, v);
    end ;
    redis.call('zrem', KEYS[2], unpack(expiredValues));
end ;
local v = redis.call('zrange', KEYS[2], 0, 0, 'WITHSCORES');
if v[1] ~= nil then
    return v[2];
end
return nil;


















